package com.ydj.app.third.ai.yuanqi;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.List;

@Data
@Accessors(chain = true)
public class YuanQiChatCompletionsRes implements Serializable {
    /** 此次请求的 id */
    private String id;

    /** unix 时间戳 */
    private Number created;

    /** 返回的回复, 当前仅有一个 */
    private List<Choices> choices;

    /** 实际使用的助手 id */
    private String assistant_id;

    /** token 使用量 */
    private Usage usage;

    private ErrorBean error;

    /**
     * choices 数组中的每一项
     */
    @Data
    @Accessors(chain = true)
    public static class Choices {

        /** 第几个回复 */
        private Number index;

        /**
         * 结束原因
         * <ul>
         *   <li>"stop" 表示正常结束</li>
         *   <li>"sensitive" 表示审核不通过</li>
         *   <li>"tool_fail" 表示调用工具失败</li>
         * </ul>
         */
        private String finish_reason;

        /**
         * 审核等级
         * <ul>
         *   <li>"1" 表示需要结束会话</li>
         *   <li>"2" 表示需要撤回当前返回的内容</li>
         * </ul>
         */
        private String moderation_level;

        /** 返回的内容（完整形式） */
        private Message message;

        /** 返回的内容（流式返回） */
        private Delta delta;
    }

    /**
     * 返回的内容（完整形式）
     */
    @Data
    @Accessors(chain = true)
    public static class Message {

        /** 角色名称 */
        private String role;

        /** 内容详情 */
        private String content;

        /** 助手的执行步骤 */
        private List<Steps> steps;
    }

    /**
     * 助手的执行步骤
     */
    @Data
    @Accessors(chain = true)
    public static class Steps {

        /**
         * 执行步骤中的角色名称
         * <ul>
         *   <li>"assistant" 表示模型</li>
         *   <li>"tool" 表示工具调用</li>
         * </ul>
         */
        private String role;

        /**
         * 执行步骤的结果
         * <ul>
         *   <li>角色为 assistant 时表示模型的输出内容</li>
         *   <li>角色为 tool 时表示工具的输出内容</li>
         * </ul>
         */
        private String content;

        /** 角色为 tool 时有效，内容为模型生成的工具调用中的唯一 ID */
        private String tool_call_id;

        /** 模型生成的工具调用 */
        private List<ToolCalls> tool_calls;

        /** 当前执行步骤的 token 使用量 */
        private Usage usage;

        /** 当前执行步骤的耗时 */
        private Number time_cost;
    }

    /**
     * 模型生成的工具调用
     */
    @Data
    @Accessors(chain = true)
    public static class ToolCalls {

        /** 工具调用的唯一 ID */
        private String id;

        /** 调用的工具类型，当前只支持 function */
        private String type;

        /** 具体调用的 function */
        private Function function;
    }

    /**
     * 具体调用的 function
     */
    @Data
    @Accessors(chain = true)
    public static class Function {

        /** function 名称 */
        private String name;

        /** function 描述 */
        private String desc;

        /** function 类型，当前支持 tool/knowledge/workflow */
        private String type;

        /** 调用 function 的参数，JSON 格式 */
        private String arguments;
    }

    /**
     * 返回的内容（流式返回）
     */
    @Data
    @Accessors(chain = true)
    public static class Delta {

        /**
         * 角色名称（流式返回）
         * <ul>
         *   <li>"assistant" 表示模型</li>
         *   <li>"tool" 表示工具调用</li>
         * </ul>
         */
        private String role;

        /**
         * 内容详情（流式返回）
         * <ul>
         *   <li>角色为 assistant 时表示模型的输出内容</li>
         *   <li>角色为 tool 时表示工具的输出内容</li>
         * </ul>
         */
        private String content;

        /** 角色为 tool 时有效，内容为模型生成的工具调用中对应的 tool_call ID（流式返回） */
        private String tool_call_id;

        /** 模型生成的工具调用（流式返回） */
        private List<ToolCalls> tool_calls;

        /** 当前执行步骤的耗时（流式返回） */
        private Number time_cost;
    }

    /**
     * token 使用量
     */
    @Data
    @Accessors(chain = true)
    public static class Usage {

        /** 问题 token 使用量 */
        private Number prompt_tokens;

        /** 回答 token 使用量 */
        private Number completion_tokens;

        /** token 总使用量 */
        private Number total_tokens;
    }

    @Data
    @Accessors(chain = true)
    public static class ErrorBean {
        private String code;

        private String message;

    }
}
